package srdb.migration.dbhandler.redwood;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import srdb.migration.MigrationToolkit;
import srdb.migration.Utility;
import srdb.migration.common.IMTKConnection;
import srdb.migration.common.MTKBridge;
import srdb.migration.common.MTKConstants;
import srdb.migration.i18n.ResourceHandler;
import srdb.migration.schema.metadata.Column;
import srdb.migration.schema.metadata.Table;


public class EDBBridge extends MTKBridge {
	private static final String BLOB_FILE_NAME = "mtk_blobdata";

	public EDBBridge(IMTKConnection srcConn, IMTKConnection targetConn) {
		super(srcConn, targetConn);
	}

	public long setTableData(Table table, int batchSize,
			MTKConstants.DATABASE_TYPE sourceDBType,
			MTKConstants.DATABASE_TYPE targetDBType) throws Exception {
		return 0;
		// long committedRowCount = 0L;
		// boolean lastBatchFailure = false;
		// Connection _edbConn = null;
		// boolean defaultAutoCommitMode = false;
		// PreparedStatement insertStmt = null;
		// Statement sourceStmt = null;
		// Statement destStmt = null;
		// ResultSet rs = null;
		// String insertStr = "";
		// File f = null;
		// FileOutputStream fos = null;
		// FileInputStream fis = null;
		//
		// FileInputStream[] arrFis = new
		// FileInputStream[table.getLargeObjectsColumnCount()];
		// int fisIndex = 0;
		//
		// for (int i = 0; i < arrFis.length; i++) {
		// arrFis[i] = null;
		// }
		//
		// int j = 0;
		// try
		// {
		// this.targetConn.getConnection().setAutoCommit(false);
		// insertStr = "INSERT INTO " + table.getTargetSchemaQualifiedName() +
		// " VALUES (";
		// for (int i = 0; i < table.getColumns().size(); i++) {
		// if
		// (table.getColumns().get(i).getDataTypeString().equalsIgnoreCase("TIMESTAMP WITH TIME ZONE"))
		// insertStr = insertStr +
		// "TO_TIMESTAMP_TZ(?, 'YYYY-MM-DD HH24:MI:SS:FF TZR')";
		// else {
		// insertStr = insertStr + "?";
		// }
		// if (i < table.getColumns().size() - 1)
		// insertStr = insertStr + ", ";
		// }
		// insertStr = insertStr + ")";
		// insertStmt =
		// this.targetConn.getConnection().prepareStatement(insertStr);
		//
		// destStmt = this.targetConn.getConnection().createStatement();
		// destStmt.execute("TRUNCATE TABLE " +
		// table.getTargetSchemaQualifiedName());
		// this.targetConn.commit();
		//
		// _edbConn = this.srcConn.getConnection();
		// defaultAutoCommitMode = _edbConn.getAutoCommit();
		// _edbConn.setAutoCommit(false);
		//
		// sourceStmt = this.srcConn.getConnection().createStatement();
		//
		// sourceStmt.setFetchSize(100);
		// rs = sourceStmt.executeQuery(table.getSelectSQL());
		//
		// while (rs.next()) {
		// for (int i = 0; i < table.getColumns().size(); i++) {
		// Column column = table.getColumns().get(i);
		//
		// switch
		// (1.$SwitchMap$com$edb$schema$metadata$Column$DataType[table.getColumns().get(i).getDataType().ordinal()])
		// {
		// case 1:
		// case 2:
		// case 3:
		// case 4:
		// case 5:
		// case 6:
		// insertStmt.setString(i + 1, rs.getString(i + 1));
		// break;
		// case 7:
		// if (rs.getObject(i + 1) != null)
		// {
		// if (new Double(rs.getDouble(i + 1)).equals(Double.valueOf((0.0D /
		// 0.0D))))
		// insertStmt.setNull(i + 1, 6);
		// else
		// insertStmt.setDouble(i + 1, rs.getDouble(i + 1));
		// }
		// else {
		// insertStmt.setNull(i + 1, 6);
		// }
		//
		// break;
		// case 8:
		// case 9:
		// case 10:
		// Object objVal = rs.getString(i + 1);
		//
		// if (column.isReal()) {
		// if (!rs.wasNull()) {
		// if (new Float(rs.getFloat(i + 1)).equals(Float.valueOf((0.0F /
		// 0.0F))))
		// insertStmt.setNull(i + 1, 6);
		// else
		// insertStmt.setFloat(i + 1, rs.getFloat(i + 1));
		// }
		// else
		// insertStmt.setNull(i + 1, 6);
		// }
		// else if (column.isDouble()) {
		// if (!rs.wasNull()) {
		// if (new Float(rs.getFloat(i + 1)).equals(Float.valueOf((0.0F /
		// 0.0F))))
		// insertStmt.setNull(i + 1, 8);
		// else
		// insertStmt.setDouble(i + 1, rs.getFloat(i + 1));
		// }
		// else {
		// insertStmt.setNull(i + 1, 8);
		// }
		// }
		// else if (!rs.wasNull()) {
		// if (new Double(rs.getDouble(i + 1)).equals(Double.valueOf((0.0D /
		// 0.0D))))
		// insertStmt.setNull(i + 1, 2);
		// else
		// insertStmt.setBigDecimal(i + 1, rs.getBigDecimal(i + 1));
		// }
		// else {
		// insertStmt.setNull(i + 1, 2);
		// }
		//
		// break;
		// case 11:
		// insertStmt.setTimestamp(i + 1, rs.getTimestamp(i + 1));
		// break;
		// case 12:
		// if
		// (column.getDataTypeString().equalsIgnoreCase("TIMESTAMP WITH TIME ZONE"))
		// {
		// String tswtzVal = null;
		//
		// if (rs.getTimestamp(i + 1) != null) {
		// DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS Z");
		// tswtzVal = df.format(Long.valueOf(rs.getTimestamp(i + 1).getTime()));
		// }
		//
		// insertStmt.setString(i + 1, tswtzVal);
		// } else {
		// insertStmt.setTimestamp(i + 1, rs.getTimestamp(i + 1));
		// }
		// break;
		// case 13:
		// insertStmt.setTime(i + 1, rs.getTime(i + 1));
		// break;
		// case 14:
		// byte[] b = rs.getBytes(i + 1);
		// if (b != null) {
		// f = new File(Utility.getTempPath() + "mtk_blobdata" + "_" +
		// table.getFullName() + fisIndex);
		// fos = new FileOutputStream(f);
		// fos.write(b);
		// fos.close();
		// arrFis[fisIndex] = new FileInputStream(f);
		// insertStmt.setBinaryStream(i + 1, arrFis[(fisIndex++)],
		// (int)f.length());
		// } else {
		// insertStmt.setNull(i + 1, -2);
		// }
		// break;
		// case 15:
		// String intervalValue = rs.getString(i + 1);
		//
		// if (intervalValue != null) {
		// intervalValue =
		// convertToORAIntervalFormat(column.getDataTypeString().toUpperCase(),
		// intervalValue);
		// }
		//
		// insertStmt.setString(i + 1, intervalValue);
		// break;
		// default:
		// throw new Exception("Invalid DataType");
		// }
		// }
		// insertStmt.addBatch();
		// j++;
		//
		// if (j % batchSize != 0)
		// continue;
		// try {
		// insertStmt.executeBatch();
		// lastBatchFailure = false;
		// Utility.getLogger().info("[" + table.getName() + "] " +
		// ResourceHandler.getValue("INFO_MIGRATED_ROWS", new Object[] {
		// Integer.valueOf(j) }));
		// }
		// catch (Exception ex) {
		// Utility.getLogger().warn(ex.getMessage() + ", Skipping Batch");
		// Utility.getLogger().error("Stack Trace:", ex);
		// MigrationToolkit.incrementFailureCount();
		// table.incrementBatchFailureCount();
		// lastBatchFailure = true;
		// }
		// insertStmt.clearBatch();
		// this.targetConn.commit();
		//
		// if (!lastBatchFailure) {
		// committedRowCount += batchSize;
		// }
		//
		// for (int i = 0; i < arrFis.length; i++) {
		// if (arrFis[i] != null) {
		// arrFis[i].close();
		// new File(Utility.getTempPath() + "mtk_blobdata" + "_" +
		// table.getFullName() + i).delete();
		// arrFis[i] = null;
		// }
		// }
		//
		// fisIndex = 0;
		// }
		//
		// int[] lastBatchCmdCount = null;
		// try
		// {
		// lastBatchCmdCount = insertStmt.executeBatch();
		// lastBatchFailure = false;
		//
		// if (lastBatchCmdCount.length > 0) {
		// committedRowCount += j % batchSize;
		// Utility.getLogger().info("[" + table.getName() + "] " +
		// ResourceHandler.getValue("INFO_MIGRATED_ROWS", new Object[] {
		// Long.valueOf(committedRowCount) }));
		// }
		// }
		// catch (Exception ex) {
		// Utility.getLogger().warn(ex.getMessage() + ", Skipping Batch");
		// Utility.getLogger().error("Stack Trace:", ex);
		// MigrationToolkit.incrementFailureCount();
		// table.incrementBatchFailureCount();
		// lastBatchFailure = true;
		// }
		// insertStmt.clearBatch();
		// this.targetConn.commit();
		//
		// for (int i = 0; i < arrFis.length; i++)
		// if (arrFis[i] != null) {
		// arrFis[i].close();
		// new File(Utility.getTempPath() + "mtk_blobdata" + "_" +
		// table.getFullName() + i).delete();
		// }
		// }
		// catch (SQLException SQLe)
		// {
		// this.targetConn.rollback();
		// if (SQLe.getNextException() != null) {
		// throw SQLe.getNextException();
		// }
		// throw SQLe;
		// }
		// catch (Exception ex) {
		// this.targetConn.rollback();
		// throw ex;
		// }
		// finally {
		// if (_edbConn != null) {
		// _edbConn.setAutoCommit(defaultAutoCommitMode);
		// }
		//
		// this.targetConn.getConnection().setAutoCommit(true);
		//
		// if (insertStmt != null) {
		// insertStmt.close();
		// }
		//
		// if (destStmt != null) {
		// destStmt.close();
		// }
		//
		// if (rs != null) {
		// rs.close();
		// }
		//
		// if (sourceStmt != null) {
		// sourceStmt.close();
		// }
		// }
		// return committedRowCount;
	}

	public long setTableDataInSafeMode(Table table,
			MTKConstants.DATABASE_TYPE sourceDBType,
			MTKConstants.DATABASE_TYPE targetDBType) throws Exception {
		return 0L;
	}

	private String convertToORAIntervalFormat(String dataType,
			String intervalValue) {
		if (dataType.startsWith("INTERVAL YEAR")) {
			if ((intervalValue.indexOf("years") >= 0)
					&& (intervalValue.indexOf("mons") >= 0)) {
				intervalValue = intervalValue.replace("years", "-");
				intervalValue = intervalValue.replace("mons", "");
			} else if (intervalValue.indexOf("years") >= 0) {
				intervalValue = intervalValue.replace("years", "-0");
			} else if (intervalValue.indexOf("mons") >= 0) {
				intervalValue = "0-" + intervalValue;
				intervalValue = intervalValue.replace("mons", "");
			} else {
				intervalValue = "0-0";
			}

			intervalValue = intervalValue.replace(" ", "");
		} else if (intervalValue.indexOf("days") >= 0) {
			intervalValue = intervalValue.replace("days", "");
			intervalValue = intervalValue.endsWith(" ") ? intervalValue
					.replace(" ", " 00:00:00") : intervalValue;
		} else {
			intervalValue = "0 " + intervalValue;
		}

		return intervalValue;
	}
}

/*

 */